﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DomainModel
{
   public enum Outcome {
        Indefinite, 
        Low, 
        High,
        Right, 
        NoMoreGuesses, 
        OldGuess
    }

    public struct GuessedNumber 
    {
        public int? Number;
        public Outcome Outcome;
    } 

  public class SecretNumber
    {
      //De gissade talen i en lista av typen GuessedNumber
      private List<GuessedNumber> _guessedNumbers;
      //Det hemliga talet
      private int? _number;
      public const int MaxNumberOfGuesses = 7;

      public bool CanMakeGuess 
      {
          //För att få tag i en konstant räcker det med att skriva variabelnamnet
          //Här tittar vi om antalet gjorda gissningar är mindre än maxantalet gissningar om ja return true annars false;
          get { return this._guessedNumbers.Count() < MaxNumberOfGuesses; }
      }

      public int Count
      {
          get { return this._guessedNumbers.Count(); }
      }

      public int? Guess
      {
          get { return this.LastGuessedNumber;}
          set { this._guessedNumbers.Add(value); }
      }

      public IList<GuessedNumber> GuessedNumbers
      {
        get {return _guessedNumbers.AsReadOnly();}
        }
    
        public GuessedNumber? LastGuessedNumber
        {
            get{
                if(GuessedNumbers.Count() == 0)
                {
                    return null;
                }else{
                    return _guessedNumbers.Last();
                }
            }
        }

    public int? Number
    {
        get {if(this.CanMakeGuess)
        {
            return null;
        }else{
            return this._number;
        }}
        private set { this._number = value;}
    }
    

      public SecretNumber ()
    {
        this._guessedNumbers = new List<GuessedNumber>();
        this.Initialize();

        
       }

      public void Initialize()
      {
          //Tömmer listan på tidigare gissningar
          this._guessedNumbers.Clear();

          //Skapar ett nytt hemligt nummer med random. 
          Random randomNumber = new Random();
          this.Number = randomNumber.Next(1, 101);

          //Sätter antalet gissningar till noll.
          this.Guess = 0;
      }

      public Outcome MakeGuess() 
      {
          if(this.Guess < this._number){
              return Outcome.Low;
          }else if (this.Guess > this._number)
          {
            return Outcome.High;
          }else{
            return Outcome.Right;
          }
      }
    }
}
